package com.ungs.reportes.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;

import com.ungs.bo.DetalleCompraBO;
import com.ungs.bo.IncidenteBO;
import com.ungs.bo.impl.DetalleCompraBOImpl;
import com.ungs.bo.impl.IncidenteBOImpl;
import com.ungs.entities.DetalleCompra;
import com.ungs.entities.Incidente;
import com.ungs.entities.SolicitudCompra;
import com.ungs.reportes.datasource.SolicitudCompraDS;
import com.ungs.reportes.datasource.SolicitudCompraIncDS;
import com.ungs.utils.ArchivosIO;
import com.ungs.utils.Constantes;
import com.ungs.utils.Fechas;

public class SolicitudCompraReportImpl {
	private DetalleCompraBO detalleCompraBO;
	private IncidenteBO incidenteBO;
	private SolicitudCompra solicitudCompra;
	private SolicitudCompraDS solicitudCompraDS;
	private SolicitudCompraIncDS solicitudCompraIncDS;
	private ArchivosIO archivosIO;
	private List<DetalleCompra> detalleCompraList;
	private List<Incidente> incidenteList;

	public SolicitudCompraReportImpl() {
		detalleCompraBO = new DetalleCompraBOImpl();
		incidenteBO = new IncidenteBOImpl();
		archivosIO = new ArchivosIO();
	}

	@SuppressWarnings("static-access")
	public void generarPDFFileChooser(SolicitudCompra solicitudCompra,
			boolean imprimir) {
		this.solicitudCompra = solicitudCompra;

		detalleCompraList = detalleCompraBO
				.getDetalleCompraBySolicitud(solicitudCompra);
		incidenteList = incidenteBO
				.getAllIncidenteBySolicitudCompra(solicitudCompra);

		try {
			Map<String, Object> parameters = new HashMap<String, Object>();
			parameters.putAll(parametrosSolicitudCompra());
			// parameters.put("imagen",
			// this.getClass().getResourceAsStream("/images/LOGO_CHICO.jpg"));

			FileNameExtensionFilter filter = new FileNameExtensionFilter(
					Constantes.ARCHIVO_PDF, Constantes.EXTENSION_PDF);
			String rutaCompletaFile = "";
			JFileChooser fileChooser = new JFileChooser();
			fileChooser.setFileFilter(filter);
			fileChooser.setDialogTitle(Constantes.CARGAR_ARCHIVO);
			fileChooser.setVisible(true);

			int result = fileChooser.showSaveDialog(null);

			if (result == fileChooser.APPROVE_OPTION) {
				rutaCompletaFile = fileChooser.getSelectedFile()
						.getAbsolutePath();

				String rutaCompleta = rutaCompletaFile + "SC"
						+ solicitudCompra.getCodigo() + "."
						+ Constantes.EXTENSION_PDF;

				String rutaCompletaIncidente = rutaCompletaFile + "SC_INC"
						+ solicitudCompra.getCodigo() + "."
						+ Constantes.EXTENSION_PDF;

				prepararSolicitudCompraDS();

				JasperReport report = JasperCompileManager
						.compileReport(Constantes.REPORTE_SOLICITUD_COMPRA);
				JasperPrint print = JasperFillManager.fillReport(report,
						parameters, solicitudCompraDS);

				/* Exporta el informe a PDF */
				JasperExportManager.exportReportToPdfFile(print, rutaCompleta);

				/* Incidentes */
				boolean incidente = false;
				if (incidenteList.size() > 0) {
					incidente = true;
				}

				if (incidente) {
					JasperReport reportIncidente = JasperCompileManager
							.compileReport(Constantes.REPORTE_SOLICITUD_COMPRA_INC);
					JasperPrint printIncidente = JasperFillManager.fillReport(
							reportIncidente, parameters, solicitudCompraIncDS);

					JasperExportManager.exportReportToPdfFile(printIncidente,
							rutaCompletaIncidente);
				}

				// Si eligio imprimir
				if (imprimir) {
					archivosIO.imprimirArchivo(rutaCompleta);
					if (incidente) {
						archivosIO.imprimirArchivo(rutaCompletaIncidente);
					}
				} else {
					archivosIO.verArchivo(rutaCompleta);
					if (incidente) {
						archivosIO.verArchivo(rutaCompletaIncidente);
					}
				}

			}

		} catch (Exception e) {
			System.err.println(e);
		}
	}

	public void generarPDF(SolicitudCompra solicitudCompra, boolean imprimir) {
		this.solicitudCompra = solicitudCompra;

		detalleCompraList = detalleCompraBO
				.getDetalleCompraBySolicitud(solicitudCompra);
		incidenteList = incidenteBO
				.getAllIncidenteBySolicitudCompra(solicitudCompra);

		try {
			Map<String, Object> parameters = new HashMap<String, Object>();
			parameters.putAll(parametrosSolicitudCompra());
			// parameters.put("imagen",
			// this.getClass().getResourceAsStream("/images/LOGO_CHICO.jpg"));

			String rutaCompleta = "SC" + solicitudCompra.getCodigo() + "."
					+ Constantes.EXTENSION_PDF;

			String rutaCompletaIncidente = "SC_INC"
					+ solicitudCompra.getCodigo() + "."
					+ Constantes.EXTENSION_PDF;

			prepararSolicitudCompraDS();

			JasperReport report = JasperCompileManager
					.compileReport(Constantes.REPORTE_SOLICITUD_COMPRA);
			JasperPrint print = JasperFillManager.fillReport(report,
					parameters, solicitudCompraDS);

			/* Exporta el informe a PDF */
			JasperExportManager.exportReportToPdfFile(print, rutaCompleta);

			/* Incidentes */
			boolean incidente = false;
			if (incidenteList.size() > 0) {
				incidente = true;
			}

			if (incidente) {
				JasperReport reportIncidente = JasperCompileManager
						.compileReport(Constantes.REPORTE_SOLICITUD_COMPRA_INC);
				JasperPrint printIncidente = JasperFillManager.fillReport(
						reportIncidente, parameters, solicitudCompraIncDS);

				JasperExportManager.exportReportToPdfFile(printIncidente,
						rutaCompletaIncidente);

				JasperExportManager.exportReportToPdfFile(printIncidente,
						rutaCompletaIncidente);
			}

			// Si eligio imprimir
			if (imprimir) {
				archivosIO.imprimirArchivo(rutaCompleta);
				if (incidente) {
					archivosIO.imprimirArchivo(rutaCompletaIncidente);
				}
			} else {
				archivosIO.verArchivo(rutaCompleta);
				if (incidente) {
					archivosIO.verArchivo(rutaCompletaIncidente);
				}
			}

		} catch (Exception e) {
			System.err.println(e);
		}
	}

	private Map<String, Object> parametrosSolicitudCompra() {
		Map<String, Object> parametersSC = new HashMap<String, Object>();

		String numeroSC = solicitudCompra.getCodigo();

		String fechaConfeccion = "";
		if (solicitudCompra.getFechaConfeccion() != null) {
			fechaConfeccion = Fechas.getFechaString(solicitudCompra
					.getFechaConfeccion());
		}

		String numeroOT = "";
		String nombreCortoOT = "";
		if (solicitudCompra.getOrdenTrabajo() != null) {
			numeroOT = solicitudCompra.getOrdenTrabajo()
					.getNumIdentificatorio();
			nombreCortoOT = solicitudCompra.getOrdenTrabajo().getNombreCorto();
		}

		String fechaCierre = "";
		if (solicitudCompra.getFechaCierre() != null) {
			fechaCierre = Fechas.getFechaString(solicitudCompra
					.getFechaCierre());
		}

		String razonSocialProveedor = "";
		String cuitProveedor = "";
		if (solicitudCompra.getProveedor() != null) {
			razonSocialProveedor = solicitudCompra.getProveedor()
					.getRazonSocial();
			cuitProveedor = solicitudCompra.getProveedor().getCuit();
		}

		String nombreVendedor = solicitudCompra.getNombreVendedor();
		String apellidoVendedor = solicitudCompra.getApellidoVendedor();
		String vendendor = apellidoVendedor + ", " + nombreVendedor;

		String estado = "";
		if (solicitudCompra.getEstado() != null) {
			estado = solicitudCompra.getEstado();
		}

		String fechaEntrega = Fechas.getFechaStringConHora(solicitudCompra
				.getCondicionEntrega().getFechaEntrega());
		String horarioEntrega = solicitudCompra.getCondicionEntrega()
				.getTurnoEntrega();
		String tipoEntrega = solicitudCompra.getCondicionEntrega()
				.getCondicionRetiro();
		String direccionEntrega = "";

		if (tipoEntrega.equals(Constantes.TIPO_RETIRO_PROVEEDOR)) {
			direccionEntrega = solicitudCompra.getProveedor().getDireccion()
					.getCalle()
					+ " "
					+ solicitudCompra.getProveedor().getDireccion().getNumero()
					+ ", "
					+ solicitudCompra.getProveedor().getDireccion()
							.getLocalidad();
		}

		float subTotal = 0;
		float iva = 0;
		float montoIva = 0;
		float total = 0;

		for (DetalleCompra detalleCompra : detalleCompraList) {
			float importeDetalle = detalleCompra.getImporte();
			subTotal = subTotal + importeDetalle;
		}

		iva = solicitudCompra.getIva();

		montoIva = subTotal * iva / 100;
		total = montoIva + subTotal;

		parametersSC.put("imagen",Constantes.LOGO_GRANDE);
		parametersSC.put("numeroSC", numeroSC);
		parametersSC.put("fechaConfeccion", fechaConfeccion);
		parametersSC.put("fechaCierre", fechaCierre);
		parametersSC.put("numeroOT", numeroOT);
		parametersSC.put("nombreCorto", nombreCortoOT);
		parametersSC.put("proveedor", razonSocialProveedor);
		parametersSC.put("cuitProveedor", cuitProveedor);
		parametersSC.put("vendedor", vendendor);
		parametersSC.put("fechaEntrega", fechaEntrega);
		parametersSC.put("turnoEntrega", horarioEntrega);
		parametersSC.put("condicionRetiro", tipoEntrega);
		parametersSC.put("direccionRetiro", direccionEntrega);
		parametersSC.put("estadoSC", estado);
		parametersSC.put("subtotal", "$ " + subTotal);
		parametersSC.put("iva", iva + " %");
		parametersSC.put("montoIva", "$ " + montoIva);
		parametersSC.put("total", "$ " + total);

		return parametersSC;

	}

	private void prepararSolicitudCompraDS() {
		incidenteList = incidenteBO
				.getAllIncidenteBySolicitudCompra(solicitudCompra);

		solicitudCompraDS = new SolicitudCompraDS();
		solicitudCompraDS.addDetalleCompralList(detalleCompraList);

		solicitudCompraIncDS = new SolicitudCompraIncDS();
		solicitudCompraIncDS.addIncidenteList(incidenteList);

	}

}
